#include "StdAfx.h"
#include "FactoryEscenario.h"
#include "FactoryElementos.h"
#include "TexturaFactory.h"
#include "General.h"
#include "Log4Cpp.h"
#include "Elemento.h"
#include "Utilidades.h"

#include <vector>
using std::vector;

FactoryEscenario::FactoryEscenario(void)
{
}
Escenario* FactoryEscenario::GenerarEscenario(NodoXML* nodoEscenario)
{
	Escenario* escenario = new Escenario(nodoEscenario->getAttribute("id"));

	vector<NodoXML>::iterator it;
	vector<NodoXML> listaDefEscenario = nodoEscenario->getChildrenList();

	bool texturasOK = false;
	bool elementosOK = false;
	bool generalOK = false;
	
	for(it=listaDefEscenario.begin(); it<listaDefEscenario.end(); it++)
	{
		if ( Utilidades::sonStringsIguales(it->getRoot(),"ListadoDeTexturas"))
		{
			vector<Textura*> vTexturas = TexturaFactory::GetTexturaInstance(it->getChildrenList());
			vector<Textura*>::iterator itTexturas;
			for(itTexturas = vTexturas.begin(); itTexturas < vTexturas.end(); itTexturas++)
			{
				if( BuscarId(escenario, (*itTexturas)->GetIdTextura().tostring((*itTexturas)->GetIdTextura().size())))
				{
					Log4Cpp::error("Id duplicado de una Textura con otro Id ya cargado, no se pudo cargar.\n","FactoryEscenario");
					itTexturas = vTexturas.erase(itTexturas);// Si ya esta en escenario no lo agrego
		 		};
				
			}
			TexturaFactory factoryTextura;
			escenario->SetVectorTextura(vTexturas);
			texturasOK=true;
		}
		else if (Utilidades::sonStringsIguales(it->getRoot(),"General"))
		{
			if ( !FactoryEscenario::BuscarId( escenario, it->getAttribute("id")))
			{
				General *gen = new General();
				gen->SetId(it->getAttribute("id"));
				gen->SetResolucion(atoi(it->getAttribute("resolucion").c_str()));
				gen->SetColorFondoElem(it->getAttribute("colorFondoEle").c_str());
				gen->SetIdTextEle(it->getAttribute("texturaEle").c_str());
				gen->SetColorLinea(it->getAttribute("colorLinea").c_str());
				gen->SetColorFondoEsc(it->getAttribute("colorFondoEsc").c_str());
				gen->SetIdTextEsc(it->getAttribute("texturaEsc").c_str());
				escenario->SetGeneral(gen);
				generalOK=true;
			}else
				Log4Cpp::info("Id repetido de General con otro Id ya cargado, no se pudo cargar.\n","FactoryEscenario");

		}else if (Utilidades::sonStringsIguales(it->getRoot(),"ListadoDeElementos"))
			{
				vector<Elemento*> vElementos = FactoryElementos::getListaElementos(it->getChildrenList(),escenario);
				vector<Elemento*>::iterator itElemento;
				for(itElemento = vElementos.begin(); itElemento < vElementos.end(); itElemento++)
				{
					if (BuscarId(escenario, (*itElemento)->GetId().tostring((*itElemento)->GetId().size())))
					{
						String idAuxiliar = (*itElemento)->GetId();
						idAuxiliar += "Default";
						(*itElemento)->SetId(idAuxiliar);
						Log4Cpp::error("Id duplicado de un Elemento con Id ya cargado, se puso in Id por default.\n", "FactoryEscenario");
						//itElemento = vElementos.erase(itElemento);
					}
				}
				escenario->setListaElementos(vElementos);
				elementosOK=true;
			}
			else Log4Cpp::info("Un hijo del escenario no es reconocido debido a un tag mal cerrado.\n","FactoryEscenario");
	}

	if (!generalOK){
		Log4Cpp::info("Elementos generales no encontrados en XML, se utilizan valores por defecto.\n","FactoryEscenario");
		General *gen = new General();
		escenario->SetGeneral(gen);
	}
	if (!elementosOK){
		Log4Cpp::error("Atencion, lista de elementos no encontrada en XML.\n","FactoryEscenario");

	}
	if (!texturasOK){
		Log4Cpp::error("Atencion, lista de texturas no encontrada en XML.\n","FactoryEscenario");

	}
	
	return escenario;
}

bool FactoryEscenario::BuscarId(Escenario *escenario, string Id)
{
	bool encontrado = false;
	if (escenario->GetId() == Id)
		encontrado = true;
	else
	{	General *gen = escenario->GetGeneral();
		if (gen != NULL)
		{
			if (gen->GetId() == Id)
			{
				//Id encontrado imprimir atributos de general
				encontrado = true;
			}//Ahora lo busco en la lista de texturas
			else
			{
				vector<Textura*> vText;
				vText = escenario->GetListaTexturas();
				vector<Textura*>::iterator itText;
				for(itText = vText.begin(); itText<vText.end(); itText++)
				{
					if( (*itText)->GetIdTextura() == Id)
					{
						encontrado = true;
						break;
					}
				}
			if( encontrado == false )
			{
				vector<Elemento*> vElem = (*escenario).getListaElementos();
				vector<Elemento*>::iterator itElem;
				for (itElem=vElem.begin(); itElem<vElem.end(); ++itElem)
				{
					if ( (*itElem)->getid() == Id)
					{
					encontrado = true;
					break;
					}
				}
			}
			
			
		}
	}
	}
return encontrado;
}	
